home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 6 / QRZ Ham Radio Callsign Database - Volume 6.iso / pc / files / dsp / dspkgctr.z / dspkgctr / gcc / config / dsp96k.md < prev    next >
Encoding:
Text File  |  1992-06-08  |  51.5 KB  |  2,484 lines

  1. ;;- Machine description for the Motorola 96000 for GNU C compiler
  2. ;;   Copyright ( C ) 1988 Free Software Foundation, Inc.
  3. ;;
  4. ;;      $Header: /usr1/dsp/cvsroot/source/gcc/config/dsp96k.md,v 1.32 92/02/28 15:24:43 jeff Exp $
  5. ;;      $Id: dsp96k.md,v 1.32 92/02/28 15:24:43 jeff Exp $
  6. ;;
  7. ;; This file is part of GNU CC.
  8.  
  9. ;; GNU CC is free software; you can redistribute it and/or modify
  10. ;; it under the terms of the GNU General Public License as published by
  11. ;; the Free Software Foundation; either version 1, or ( at your option )
  12. ;; any later version.
  13.  
  14. ;; GNU CC is distributed in the hope that it will be useful,
  15. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. ;; GNU General Public License for more details.
  18.  
  19. ;; You should have received a copy of the GNU General Public License
  20. ;; along with GNU CC; see the file COPYING.  If not, write to
  21. ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  22.  
  23.  
  24. ;;- See file "rtl.def" for documentation on define_insn, match_*, et. al.
  25.  
  26. ;;- cpp macro #define NOTICE_UPDATE_CC in file tm.h handles condition code
  27. ;;- updates for most instructions.
  28.  
  29.  
  30. ;;
  31. ;;  ...........................................................................
  32. ;;
  33. ;;          MOVES, LOADS, STORES
  34. ;;
  35. ;;  ...........................................................................
  36. ;;
  37.  
  38. ( define_expand "movsi" 
  39.   [ ( set
  40.       ( match_operand:SI 0 "general_operand" "" )
  41.       ( match_operand:SI 1 "general_operand" "" ))
  42.   ]
  43.   ""
  44.   "
  45. {
  46.     /* gcc will, by default, generate mem-mem and mem-const moves, even 
  47.        though the insn templates clearly show that these sorts of moves are
  48.        not supported by the target architecture. These moves will exist
  49.        in the rtl until the reload pass, where they will be broken into 
  50.        multiple insns. 
  51.  
  52.        we attept to break the insn as early as possible (when it is generated)
  53.        in order that the optimizer might make use of the information. this
  54.        also reduces spill code, which is very important when one considers
  55.        the way that gcc loosely generates reloads.
  56.  
  57.        All of the scalar movXX templates use this technique. */
  58.  
  59.     if (( ! is_in_reg_p ( operands[0] )) && ( ! is_in_reg_p ( operands[1] )))
  60.     {
  61.     operands[1] = force_reg ( SImode, operands[1] );
  62.     }
  63. }" )
  64.  
  65. ( define_insn ""
  66.   [ ( set
  67.       ( match_operand:SI 0 "general_operand" "=d,<>m,r,r" )
  68.       ( match_operand:SI 1 "general_operand"  "d,r,<>m,g" ))
  69.   ]
  70.   ""
  71.   "*
  72. {
  73.     switch ( which_alternative )
  74.     {
  75.     
  76.     case 0:
  77.     RETURN_DSP ( \"tfr    %1,%0\" );
  78.     
  79.     case 1:
  80.         RETURN_DSP ( \"move    %z1,@:%0\" );
  81.  
  82.     case 2:
  83.     RETURN_DSP ( \"move    @:%1,%z0\" );
  84.  
  85.     default:
  86.     RETURN_DSP ( \"move    %z1,%z0\" );
  87.     }
  88. }" )
  89.  
  90. ( define_expand "movqi"
  91.   [ ( set
  92.       ( match_operand:QI 0 "general_operand" "" )
  93.       ( match_operand:QI 1 "general_operand" "" ))
  94.   ]
  95.   ""
  96.   "
  97. {
  98.     /* this is exactly the same as movsi. gcc requires that QImode be
  99.        supported, so we can't just provide movsi et al. */
  100.  
  101.     if (( ! is_in_reg_p ( operands[0] )) && ( ! is_in_reg_p ( operands[1] )))
  102.     {
  103.     operands[1] = force_reg ( QImode, operands[1] );
  104.     }
  105. }" )
  106.  
  107. ( define_insn ""
  108.   [ ( set
  109.       ( match_operand:QI 0 "general_operand" "=d,<>m,r,r" )
  110.       ( match_operand:QI 1 "general_operand"  "d,r,<>m,g" ))
  111.   ]
  112.   ""
  113.   "*
  114. {
  115.     switch ( which_alternative )
  116.     {
  117.     
  118.     case 0:
  119.     RETURN_DSP ( \"tfr    %1,%0\" );
  120.     
  121.     case 1:
  122.         RETURN_DSP ( \"move    %z1,@:%0\" );
  123.  
  124.     case 2:
  125.     RETURN_DSP ( \"move    @:%1,%z0\" );
  126.  
  127.     default:
  128.     RETURN_DSP ( \"move    %z1,%z0\" );
  129.     }
  130. }" )
  131.  
  132. ;; This partial DImode support is provided so that the reload pass and
  133. ;; the constant folder won't run into trouble when dealing with multiply
  134. ;; results.
  135.  
  136. ( define_insn "movdi"
  137.   [ ( set
  138.       ( match_operand:DI 0 "general_operand" "=D,m,D,D" )
  139.       ( match_operand:DI 1 "general_operand" "m,D,D,i" ))
  140.   ]
  141.   ""
  142.   "*
  143. {
  144.     switch ( which_alternative )
  145.     {
  146.     case 0:
  147.     if ( 'l' == memory_model )
  148.     {
  149.         RETURN_DSP ( \"move    l:%1,%0.ml\" );
  150.     }
  151.     else
  152.     {
  153.         switch ( GET_CODE ( XEXP ( operands[1], 0 )))
  154.         {
  155.         case REG:
  156.         operands[2] = XEXP ( operands[1], 0 );
  157.  
  158.         RETURN_DSP ( 
  159.              \"move    @:(%2)+,%0.m\;move    @:(%2)-,%0.l\" );
  160.  
  161.         case PLUS:
  162.         default:
  163.         /* we have a constant address. */
  164.         operands[2] =
  165.             gen_mem_plus_const_int_from_mem ( operands[1], 1 );
  166.  
  167.         RETURN_DSP ( \"move    @:%1,%0.m\;move    @:%2,%0.l\" );
  168.         }
  169.     }
  170.     
  171.     case 1:
  172.     if ( 'l' == memory_model )
  173.     {
  174.         RETURN_DSP ( \"move    %1.ml,l:%0\" );
  175.     }
  176.     else
  177.     {
  178.         switch ( GET_CODE ( XEXP ( operands[0], 0 )))
  179.         {
  180.         case REG:
  181.         operands[2] = XEXP ( operands[0], 0 );
  182.  
  183.         RETURN_DSP ( 
  184.              \"move    %1.m,@:(%2)+\;move    %1.l,@:(%2)-\" );
  185.  
  186.         case PLUS:
  187.         default:
  188.         operands[2] =
  189.             gen_mem_plus_const_int_from_mem ( operands[0], 1 );
  190.  
  191.         RETURN_DSP ( \"move    %1.m,@:%0\;move    %1.l,@:%2\" );
  192.         }
  193.     }
  194.     
  195.     case 2:
  196.     RETURN_DSP ( \"tfr    %1.l,%0.l    %1.m,%0.m\" );
  197.  
  198.     case 3:
  199.     if ( INTVAL ( operands[1] ) < 0 )
  200.     {
  201.         RETURN_DSP ( \"move    #%c1,%0.l\;move    #-1,%0.m\" );
  202.     }
  203.     else
  204.     {
  205.         RETURN_DSP ( \"move    #%c1,%0.l\;move    #0,%0.m\" );
  206.     }
  207.     }
  208. }" )
  209.  
  210. ( define_expand "movdf"
  211.   [ ( set
  212.       ( match_operand:DF 0 "general_operand" "" )
  213.       ( match_operand:DF 1 "general_operand" "" ))
  214.   ]
  215.   ""
  216.   "
  217. {
  218.     if (( ! is_in_reg_p ( operands[0] )) && ( ! is_in_reg_p ( operands[1] )))
  219.     {
  220.     operands[1] = force_reg ( DFmode, operands[1] );
  221.     }
  222. }" )
  223.     
  224. ( define_insn ""
  225.   [ ( set 
  226.       ( match_operand:DF 0 "general_operand" "=f,f,<>m" )
  227.       ( match_operand:DF 1 "general_operand"  "f,<>m,f" ))
  228.   ]
  229.   ""
  230.   "*
  231. {
  232.     switch ( which_alternative )
  233.     {
  234.  
  235.     case 0:
  236.     RETURN_DSP ( \"ftfr.x    %1,%0\" );
  237.  
  238.     case 1:
  239.     if ( 'l' == memory_model )
  240.     {
  241.         RETURN_DSP ( \"move    l:%1,%z0\" );
  242.     }
  243.     else
  244.     {
  245.         switch ( GET_CODE ( XEXP ( operands[1], 0 )))
  246.         {
  247.         case POST_INC:
  248.  
  249.         RETURN_DSP ( 
  250.         \"move    @:%1,d8.m\;move    @:%1,d8.l\;move    d8.ml,%z0\" );
  251.         
  252.         case POST_DEC:
  253.  
  254.         operands[2] = XEXP ( operands[1], 0 );
  255.         RETURN_DSP ( 
  256.         \"move    @:(%2)+,d8.m\;move    @:(%2)-,d8.l\;move    d8.ml,%z0\;move    (%2)-\;move    (%2)-\" );
  257.  
  258.         case REG:
  259.  
  260.         operands[2] = XEXP ( operands[1], 0 );
  261.         RETURN_DSP (
  262.         \"move    @:(%2)+,d8.m\;move    @:(%2)-,d8.l\;move    d8.ml,%z0\" );
  263.  
  264.         case PLUS:
  265.         default:
  266.         operands[2] = 
  267.             gen_mem_plus_const_int_from_mem ( operands[1], 1 );
  268.             
  269.         RETURN_DSP (
  270.         \"move    @:%1,d8.m\;move    @:%2,d8.l\;move    d8.ml,%z0\" );
  271.         }
  272.     }
  273.  
  274.     case 2:
  275.     if ( 'l' == memory_model )
  276.     {
  277.         RETURN_DSP ( \"move    %z1,l:%0\" );
  278.     }
  279.     else
  280.     {
  281.         switch ( GET_CODE ( XEXP ( operands[0], 0 )))
  282.         {
  283.         case POST_INC
  284. :
  285.         RETURN_DSP (
  286.         \"move    %z1,d8.ml\;move    d8.m,@:%0\;move    d8.l,@:%0\" );
  287.         
  288.         case POST_DEC:
  289.  
  290.         operands[2] = XEXP ( operands[0], 0 );
  291.         RETURN_DSP (
  292.         \"move    %z1,d8.ml\;move    d8.m,@:(%2)+\;move    d8.l,@:(%2)-\;move    (%2)-\;move    (%2)-\" );
  293.         
  294.         case REG:
  295.  
  296.         operands[2] = XEXP ( operands[0], 0 );
  297.         RETURN_DSP (
  298.         \"move    %z1,d8.ml\;move    d8.m,@:(%2)+\;move    d8.l,@:(%2)-\" );
  299.  
  300.         case PLUS:
  301.         default:
  302.         operands[2] = 
  303.             gen_mem_plus_const_int_from_mem ( operands[0], 1 );
  304.  
  305.         RETURN_DSP ( 
  306.         \"move    %z1,d8.ml\;move    d8.m,@:%0\;move    d8.l,@:%2\" );
  307.         }
  308.     }
  309.     }
  310. }" )
  311.  
  312. ( define_expand "movsf"
  313.   [ ( set
  314.       ( match_operand:SF 0 "general_operand" "" )
  315.       ( match_operand:SF 1 "general_operand" "" ))
  316.   ]
  317.   ""
  318.   "
  319. {
  320.     if (( ! is_in_reg_p ( operands[0] )) && ( ! is_in_reg_p ( operands[1] )))
  321.     {
  322.     operands[1] = force_reg ( SFmode, operands[1] );
  323.     }
  324. }" )
  325.     
  326. ( define_insn ""
  327.   [ ( set ( match_operand:SF 0 "general_operand" "=f,f,<>m" )
  328.       ( match_operand:SF 1 "general_operand"  "f,<>m,f" ))
  329.   ]
  330.   ""
  331.   "*
  332. {
  333.     switch ( which_alternative )
  334.     {
  335.     case 0:
  336.     RETURN_DSP ( \"ftfr.s    %1,%0\" );
  337.  
  338.     case 1:
  339.     RETURN_DSP ( \"move    @:%1,%z0\" );
  340.  
  341.     case 2:
  342.         RETURN_DSP ( \"move    %z1,@:%0\" );
  343.     }
  344. }" )
  345.  
  346. ;;
  347. ;;  ...........................................................................
  348. ;;
  349. ;;          BLOCKMOVES
  350. ;;
  351. ;;  ...........................................................................
  352. ;;
  353.  
  354. ( define_expand "movstrsi"
  355.   [ ( parallel [ ( set ( match_operand:BLK 0 "memory_operand" "" )
  356.                ( match_operand:BLK 1 "memory_operand" "" ))
  357.          ( use ( match_operand:SI 2 "general_operand" "" ))
  358.          ( use ( match_operand:SI 3 "general_operand" "" )) ] )
  359.   ]
  360.   ""
  361.   "
  362. {
  363.     rtx dbl_reg, op0_reg, op1_reg;
  364.     
  365.     op0_reg = gen_reg_rtx ( SImode );
  366.     emit_move_insn ( op0_reg, force_reg ( SImode, XEXP ( operands[0], 0 )));
  367.     
  368.     op1_reg = gen_reg_rtx ( SImode );
  369.     emit_move_insn ( op1_reg, force_reg ( SImode, XEXP ( operands[1], 0 )));
  370.     
  371.     dbl_reg = gen_reg_rtx ( DFmode );
  372.  
  373.     if ( CONST_DOUBLE == GET_CODE ( operands[2] ))
  374.     {
  375.     operands[2] = gen_rtx ( CONST_INT, VOIDmode, 
  376.                    CONST_DOUBLE_LOW ( operands[2] ));
  377.     }
  378.     
  379.     emit_insn (
  380.            gen_rtx ( PARALLEL, VOIDmode,
  381.             gen_rtvec ( 7,
  382.                    gen_rtx ( CLOBBER, VOIDmode, op0_reg ),
  383.                    gen_rtx ( CLOBBER, VOIDmode, op1_reg ),
  384.                    gen_rtx ( USE, VOIDmode, operands[2] ),
  385.                    gen_rtx ( CLOBBER, VOIDmode, dbl_reg ),
  386.                    gen_rtx ( SET, VOIDmode, operands[0],
  387.                         operands[1] ),
  388.                    gen_rtx ( USE, VOIDmode, op0_reg ),
  389.                    gen_rtx ( USE, VOIDmode, op1_reg ))));
  390.     
  391.     DONE;
  392. }" )
  393.  
  394. ( define_insn ""
  395.   [ ( parallel [ ( clobber ( match_operand:SI 0 "register_operand" "=a" ))
  396.          ( clobber ( match_operand:SI 1 "register_operand" "=a" ))
  397.          ( use ( match_operand:SI 2 "immediate_operand" "i" ))
  398.          ( clobber ( match_operand:DF 3 "register_operand" "=f" ))
  399.          ( set ( match_operand:BLK 4 "memory_operand" "" )
  400.                ( match_operand:BLK 5 "memory_operand" "" ))
  401.          ( use ( match_operand:SI 6 "register_operand" "0" ))
  402.          ( use ( match_operand:SI 7 "register_operand" "1" )) ] )
  403.   ]
  404. ""
  405. "*
  406. {
  407.     if ( MOVE_RATIO_96 > INTVAL ( operands[2] ))
  408.     {
  409.     static int copy_len, init = 0;
  410.     static char *copy, *buffer;
  411.     char *cp_point;
  412.     int i = 1;
  413.     
  414.     if ( ! init )
  415.     {
  416.         if ( 'l' == memory_model )
  417.         {
  418.         copy = \"move    l:(%1)+,%3.ml\;move    %3.ml,l:(%0)+\;\";
  419.         }
  420.         else if ( 'y' == memory_model )
  421.         {
  422.         copy = \"move    y:(%1)+,%3.l\;move    %3.l,y:(%0)+\;\";
  423.         }
  424.         else
  425.         {
  426.         copy = \"move    x:(%1)+,%3.l\;move    %3.l,x:(%0)+\;\";
  427.         }
  428.         copy_len = strlen ( copy );
  429.         buffer = malloc ( copy_len * MOVE_RATIO_96 + 3 );
  430.     }
  431.     buffer[0] = '\\0';
  432.  
  433.     for ( ; i <= INTVAL ( operands[2] ); ++ i )
  434.     {
  435.         strcat ( buffer, copy );
  436.     }
  437.  
  438.     return buffer;
  439.     }
  440.     else
  441.     {
  442.     operands[8] = gen_label_rtx ( );
  443.     
  444.     if ( 'l' != memory_model )
  445.     {
  446.         RETURN_DSP ( \"do    #%c2,%l8\;move    @:(%1)+,%3.l\;move    %3.l,@:(%0)+\\n%l8\" );
  447.     }
  448.     else
  449.     {
  450.         RETURN_DSP ( \"do    #%c2,%l8\;move    l:(%1)+,%3.ml\;move    %3.ml,l:(%0)+\\n%l8\" );
  451.     }
  452.     }
  453. }" )
  454.  
  455. ;;
  456. ;;  ...........................................................................
  457. ;;
  458. ;;          ADDITIONS
  459. ;;
  460. ;;  ...........................................................................
  461. ;;
  462.  
  463. ( define_insn ""
  464.   [ ( set ( match_operand:SI 0 "register_operand" "=*d,*a" )
  465.       ( plus:SI ( match_operand:SI 1 "register_operand" "0,0" )
  466.             ( match_operand:SI 2 "increment_operand" "K,K" ) ) ) ]
  467.   ""
  468.   "*
  469. {
  470.     switch ( INTVAL ( operands[2] ) )
  471.     {
  472.  
  473.     case 1:
  474.     return ( 0 == which_alternative )
  475.         ?
  476.         \"inc    %0\"
  477.             :
  478.             \"move    (%0)+\";
  479.  
  480.     case 2:
  481.     return ( 0 == which_alternative )
  482.         ?
  483.         \"inc    %0\\
  484.         \;inc    %0\"
  485.             :
  486.             \"move    (%0)+\\
  487.             \;move    (%0)+\";
  488.  
  489.     case -1:
  490.     return ( 0 == which_alternative )
  491.         ?
  492.         \"dec    %0\"
  493.             :
  494.             \"move    (%0)-\";
  495.  
  496.     case -2:
  497.     return ( 0 == which_alternative )
  498.         ?
  499.         \"dec    %0\\
  500.         \;dec    %0\"
  501.             :
  502.             \"move    (%0)-\\
  503.             \;move    (%0)-\";
  504.  
  505.     default:
  506.     abort ( );
  507.     }
  508. }" "{ TRUE }" )
  509.  
  510. ( define_insn ""
  511.   [ ( set ( match_operand:SI 0 "register_operand" "=d,??da" )
  512.       ( plus:SI ( match_operand:SI 1 "general_operand" "0,a" )
  513.             ( match_operand:SI 2 "general_operand" "d,i" )))
  514.   ]
  515.   ""
  516.   "*
  517. {
  518.     if ( which_alternative ) 
  519.     {
  520.     return \"lea    (%1+%c2),%z0\";
  521.     }
  522.     else
  523.     {
  524.     return \"add    %2,%0\";
  525.     }
  526. }" )
  527.  
  528. ( define_expand "addsi3"
  529.   [ ( set ( match_operand:SI 0 "register_operand" "=d,da" )
  530.       ( plus:SI ( match_operand:SI 1 "register_operand" "%0,a" )
  531.             ( match_operand:SI 2 "general_operand" "d,i" ) ) ) ]
  532.   ""
  533.   "
  534. {
  535.     emit_insn (
  536.            gen_rtx (
  537.             SET,
  538.             SImode,
  539.             operands[0],
  540.             gen_rtx (
  541.                  PLUS,
  542.                  SImode,
  543.                  operands[1],
  544.                  operands[2] ) ) );
  545.     DONE;
  546. }" )
  547.  
  548. ( define_insn "adddf3"
  549.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  550.       ( plus:DF ( match_operand:DF 1 "register_operand" "0" )
  551.             ( match_operand:DF 2 "register_operand" "f" ) ) ) ]
  552.   ""
  553.   "fadd.x    %2,%0" )
  554.  
  555. ( define_insn "addsf3"
  556.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  557.       ( plus:SF ( match_operand:SF 1 "register_operand" "0" )
  558.             ( match_operand:SF 2 "register_operand" "f" ) ) ) ]
  559.   ""
  560.   "fadd.s    %2,%0" )
  561.  
  562.  
  563. ;;
  564. ;;  ...........................................................................
  565. ;;
  566. ;;          SUBTRACTIONS
  567. ;;
  568. ;;  ...........................................................................
  569. ;;
  570.  
  571. ( define_insn ""
  572.   [ ( set ( match_operand:SI 0 "register_operand" "=d,=a" )
  573.       ( minus:SI ( match_operand:SI 1 "register_operand" "0,0" )
  574.             ( match_operand:SI 2 "increment_operand" "K,K" ) ) ) ]
  575.   ""
  576.   "*
  577. {
  578.     switch ( INTVAL ( operands[2] ) )
  579.     {
  580.  
  581.     case 1:
  582.     return ( 0 == which_alternative )
  583.         ?
  584.         \"dec    %0\"
  585.             :
  586.             \"move    (%0)-\";
  587.  
  588.     case 2:
  589.     return ( 0 == which_alternative )
  590.         ?
  591.         \"dec    %0\\
  592.         \;dec    %0\"
  593.             :
  594.             \"move    (%0)-\\
  595.             \;move    (%0)-\";
  596.  
  597.     case -1:
  598.     return ( 0 == which_alternative )
  599.         ?
  600.         \"inc    %0\"
  601.             :
  602.             \"move    (%0)+\";
  603.  
  604.     case -2:
  605.     return ( 0 == which_alternative )
  606.         ?
  607.         \"inc    %0\\
  608.         \;inc    %0\"
  609.             :
  610.             \"move    (%0)+\\
  611.             \;move    (%0)+\";
  612.  
  613.     default:
  614.     abort ( );
  615.     }
  616. }" "{ TRUE }" )
  617.  
  618. ( define_insn ""
  619.   [ ( set ( match_operand:SI 0 "register_operand" "=d,??da" )
  620.       ( minus:SI ( match_operand:SI 1 "general_operand" "0,a" )
  621.              ( match_operand:SI 2 "general_operand" "d,i" )))
  622.   ]
  623.   ""
  624.   "*
  625. {
  626.     if ( which_alternative )
  627.     {
  628.     return \"lea    (%1+-%c2),%z0\";
  629.     }
  630.     else
  631.     {
  632.     return \"sub    %2,%0\";
  633.     }
  634. }" )
  635.  
  636. ( define_expand "subsi3"
  637.   [ ( set ( match_operand:SI 0 "register_operand" "=d,=d=a" )
  638.       ( minus:SI ( match_operand:SI 1 "register_operand" "0,a" )
  639.              ( match_operand:SI 2 "general_operand" "d,i" ) ) ) ]
  640.   ""
  641.   "
  642. {
  643.     emit_insn (
  644.            gen_rtx (
  645.             SET,
  646.             SImode,
  647.             operands[0],
  648.             gen_rtx (
  649.                  MINUS,
  650.                  SImode,
  651.                  operands[1],
  652.                  operands[2] ) ) );
  653.     DONE;
  654. }" )
  655.  
  656. ( define_insn "subdf3"
  657.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  658.       ( minus:DF ( match_operand:DF 1 "register_operand" "0" )
  659.              ( match_operand:DF 2 "register_operand" "f" ) ) ) ]
  660.   ""
  661.   "fsub.x %2,%0" )
  662.  
  663. ( define_insn "subsf3"
  664.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  665.       ( minus:SF ( match_operand:SF 1 "register_operand" "0" )
  666.              ( match_operand:SF 2 "register_operand" "f" ) ) ) ]
  667.   ""
  668.   "fsub.s %2,%0" )
  669.  
  670.  
  671.  
  672. ;;
  673. ;;  ...........................................................................
  674. ;;
  675. ;;          DIVISION & MODULUS
  676. ;;
  677. ;;  ...........................................................................
  678. ;;
  679.  
  680. ;;
  681. ;;  ...........................................................................
  682. ;;
  683. ;;          MULTIPLICATIONS
  684. ;;
  685. ;;  ...........................................................................
  686. ;;
  687.  
  688. ( define_expand "mulsi3"
  689.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  690.       ( mult:SI ( match_operand:SI 1 "register_operand" "d" )
  691.             ( match_operand:SI 2 "register_operand" "d" )))
  692.   ]
  693.   ""
  694.   "
  695. {
  696.     rtx final_res = operands[0];
  697.     rtx intrm_res = gen_reg_rtx ( DImode );
  698.     
  699.     emit_insn ( 
  700.            gen_rtx ( SET, VOIDmode, intrm_res,
  701.             gen_rtx ( SIGN_EXTEND, DImode, 
  702.                  gen_rtx ( MULT, SImode, operands[1],
  703.                       operands[2] ))));
  704.     emit_insn (
  705.            gen_rtx ( SET, VOIDmode, final_res,
  706.             gen_rtx ( TRUNCATE, SImode, intrm_res )));
  707.     DONE;
  708. }" )
  709.  
  710. ( define_insn ""
  711.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  712.       ( sign_extend:DI
  713.         ( mult:SI ( match_operand:SI 1 "register_operand" "d" )
  714.               ( match_operand:SI 2 "register_operand" "d" ))))
  715.   ]
  716.   ""
  717.   "mpys    %2,%1,%0" )
  718.  
  719. ;; The following three insns are provided to accommodate for strength 
  720. ;; reduction in the presence of 64 bit mpy results.
  721.  
  722. ( define_insn ""
  723.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  724.       ( sign_extend:DI
  725.         ( neg:SI ( match_operand:SI 1 "register_operand" "0" ))))
  726.   ]
  727.   ""
  728.   "neg    %0" )
  729.  
  730. ( define_insn "" 
  731.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  732.       ( sign_extend:DI
  733.         ( match_operand:SI 1 "register_operand" "0" )))
  734.   ]
  735.   ""
  736.   "" )
  737.  
  738. ( define_insn ""
  739.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  740.       ( sign_extend:DI
  741.         ( match_operand:SI 1 "immediate_operand" "i" )))
  742.   ]
  743.   ""
  744.   "move    #%c1,%z0" )
  745.  
  746. ( define_expand "umulsi3"
  747.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  748.       ( umult:SI ( match_operand:SI 1 "register_operand" "d" )
  749.              ( match_operand:SI 2 "register_operand" "d" )))
  750.   ]
  751.   ""
  752.   "
  753. {
  754.     rtx final_res = operands[0];
  755.     rtx intrm_res = gen_reg_rtx ( DImode );
  756.     
  757.     emit_insn ( 
  758.            gen_rtx ( SET, VOIDmode, intrm_res,
  759.             gen_rtx ( ZERO_EXTEND, DImode,
  760.                  gen_rtx ( UMULT, SImode, operands[1],
  761.                       operands[2] ))));
  762.     emit_insn (
  763.            gen_rtx ( SET, VOIDmode, final_res,
  764.             gen_rtx ( TRUNCATE, SImode, intrm_res )));
  765.     DONE;
  766. }" )
  767.  
  768. ( define_insn ""
  769.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  770.       ( zero_extend:DI 
  771.         ( umult:SI ( match_operand:SI 1 "register_operand" "d" )
  772.                ( match_operand:SI 2 "register_operand" "d" ))))
  773.   ]
  774.   ""
  775.   "mpyu    %2,%1,%0" )
  776.  
  777. ;; The following three insns are provided to accommodate for strength 
  778. ;; reduction in the presence of 64 bit mpy results.
  779.  
  780. ( define_insn ""
  781.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  782.       ( zero_extend:DI
  783.         ( neg:SI ( match_operand:SI 1 "register_operand" "0" ))))
  784.   ]
  785.   ""
  786.   "neg    %0" )
  787.  
  788. ( define_insn "" 
  789.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  790.       ( zero_extend:DI
  791.         ( match_operand:SI 1 "register_operand" "0" )))
  792.   ]
  793.   ""
  794.   "" )
  795.  
  796. ( define_insn ""
  797.   [ ( set ( match_operand:DI 0 "register_operand" "=D" )
  798.       ( zero_extend:DI
  799.         ( match_operand:SI 1 "immediate_operand" "i" )))
  800.   ]
  801.   ""
  802.   "move    #%c1,%z0" )
  803.  
  804. ( define_insn "muldf3"
  805.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  806.       ( mult:DF ( match_operand:DF 1 "register_operand" "f" )
  807.             ( match_operand:DF 2 "register_operand" "f" )))
  808.   ]
  809.   ""
  810.   "fmpy.x    %2,%1,%0" )
  811.  
  812. ( define_insn "mulsf3"
  813.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  814.       ( mult:SF ( match_operand:SF 1 "register_operand" "f" )
  815.             ( match_operand:SF 2 "register_operand" "f" )))
  816.   ]
  817.   ""
  818.   "fmpy.s    %2,%1,%0" )
  819.  
  820. ;;
  821. ;;  ...........................................................................
  822. ;;
  823. ;;          NEGATIONS
  824. ;;
  825. ;;  ...........................................................................
  826. ;;
  827.  
  828. ( define_insn "negsi2"
  829.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  830.       ( neg:SI ( match_operand:SI 1 "register_operand" "0" )))
  831.   ]
  832.   ""
  833.   "neg    %0" )
  834.  
  835. ( define_insn "negdf2"
  836.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  837.       ( neg:DF ( match_operand:DF 1 "register_operand" "0" )))
  838.   ]
  839.   ""
  840.   "fneg.x    %0" )
  841.  
  842. ( define_insn "negsf2"
  843.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  844.       ( neg:SF ( match_operand:SF 1 "register_operand" "0" )))
  845.   ]
  846.   ""
  847.   "fneg.s    %0" )
  848.  
  849. ;;
  850. ;;  ...........................................................................
  851. ;;
  852. ;;          ABSOLUTE VALUES
  853. ;;
  854. ;;  ...........................................................................
  855. ;;
  856.  
  857. ( define_insn "abssi2"
  858.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  859.       ( abs:SI ( match_operand:SI 1 "register_operand" "0" ) ) ) ]
  860.   ""
  861.   "abs    %0" )
  862.  
  863.  
  864. ( define_insn "abssf2"
  865.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  866.       ( abs:SI ( match_operand:SF 1 "register_operand" "0" ) ) ) ]
  867.   ""
  868.   "fabs.s    %0" )
  869.  
  870.  
  871. ( define_insn "absdf2"
  872.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  873.       ( abs:SI ( match_operand:DF 1 "register_operand" "0" ) ) ) ]
  874.   ""
  875.   "fabs.x    %0" )
  876.  
  877.  
  878. ;;
  879. ;;  ...........................................................................
  880. ;;
  881. ;;          LOGICAL AND
  882. ;;
  883. ;;  ...........................................................................
  884. ;;
  885.  
  886. ( define_insn "andsi3"
  887.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  888.       ( and:SI ( match_operand:SI 1 "register_operand" "0" )
  889.            ( match_operand:SI 2 "register_operand" "d" ) ) ) ]
  890.   ""
  891.   "and    %2,%0" )
  892.  
  893. ( define_insn "andcbsi3"
  894.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  895.       ( and:SI ( match_operand:SI 1 "register_operand" "0" )
  896.            ( not:SI ( match_operand:SI 2 "register_operand" "d" ) ) ) ) ]
  897.   ""
  898.   "andc    %2,%0" )
  899.  
  900.  
  901. ;;
  902. ;;  ...........................................................................
  903. ;;
  904. ;;          LOGICAL INCLUSIVE OR
  905. ;;
  906. ;;  ...........................................................................
  907. ;;
  908.  
  909. ( define_insn "iorsi3"
  910.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  911.       ( ior:SI ( match_operand:SI 1 "register_operand" "0" )
  912.            ( match_operand:SI 2 "register_operand" "d" ) ) ) ]
  913.   ""
  914.   "or    %2,%0" )
  915.  
  916. ( define_insn "iorcbsi3"
  917.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  918.       ( ior:SI ( match_operand:SI 1 "register_operand" "0" )
  919.            ( not:SI ( match_operand:SI 2 "register_operand" "d" ) ) ) ) ]
  920.   ""
  921.   "orc    %2,%0" )
  922.  
  923.  
  924. ;;
  925. ;;  ...........................................................................
  926. ;;
  927. ;;          LOGICAL EXCLUSIVE OR
  928. ;;
  929. ;;  ...........................................................................
  930. ;;
  931.  
  932. ( define_insn "xorsi3"
  933.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  934.       ( xor:SI ( match_operand:SI 1 "register_operand" "0" )
  935.            ( match_operand:SI 2 "register_operand" "d" ) ) ) ]
  936.   ""
  937.   "eor    %2,%0" )
  938.  
  939.  
  940. ;;
  941. ;;  ...........................................................................
  942. ;;
  943. ;;          ONE'S COMPLEMENT
  944. ;;
  945. ;;  ...........................................................................
  946. ;;
  947.  
  948. ( define_insn "one_cmplsi2"
  949.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  950.       ( not:SI ( match_operand:SI 1 "register_operand" "0" ) ) ) ]
  951.   ""
  952.   "not    %0" )
  953.  
  954.  
  955. ;;
  956. ;;  ...........................................................................
  957. ;;
  958. ;;          ARITHMATIC SHIFTS
  959. ;;
  960. ;;  ...........................................................................
  961. ;;
  962.  
  963. ( define_insn "ashlsi3"
  964.   [ ( set ( match_operand:SI 0 "register_operand" "=d,=d,=d" )
  965.       ( ashift:SI ( match_operand:SI 1 "register_operand" "0,0,0" )
  966.               ( match_operand:SI 2 "general_operand" "J,n,h" ) ) ) ]
  967.   ""
  968.   "*
  969. {
  970.     switch ( which_alternative )
  971.     {
  972.  
  973.     case 0:
  974.     return \"asl    %0\";
  975.  
  976.     case 1:
  977.     return \"asl    %2&$1f,%0\";
  978.     
  979.     case 2:
  980.     return \"asl    %2.h,%0\";
  981.     }
  982. }" )
  983.  
  984. ( define_insn "ashrsi3"
  985.   [ ( set ( match_operand:SI 0 "register_operand" "=d,=d,=d" )
  986.       ( ashiftrt:SI ( match_operand:SI 1 "register_operand" "0,0,0" )
  987.             ( match_operand:SI 2 "general_operand" "J,n,h" ) ) ) ]
  988.   ""
  989.   "*
  990. {
  991.     switch ( which_alternative )
  992.     {
  993.  
  994.     case 0:
  995.     return \"asr    %0\";
  996.  
  997.     case 1:
  998.     return \"asr    %2&$1f,%0\";
  999.     
  1000.     case 2:
  1001.     return \"asr    %2.h,%0\";
  1002.     }
  1003. }" )
  1004.  
  1005.  
  1006. ;;
  1007. ;;  ...........................................................................
  1008. ;;
  1009. ;;          LOGICAL SHIFTS
  1010. ;;
  1011. ;;  ...........................................................................
  1012. ;;
  1013.  
  1014. ( define_insn "lshlsi3"
  1015.   [ ( set ( match_operand:SI 0 "register_operand" "=d,=d,=d" )
  1016.       ( lshift:SI ( match_operand:SI 1 "register_operand" "0,0,0" )
  1017.             ( match_operand:SI 2 "general_operand" "J,n,h" ) ) ) ]
  1018.   ""
  1019.   "*
  1020. {
  1021.     switch ( which_alternative )
  1022.     {
  1023.  
  1024.     case 0:
  1025.     return \"lsl    %0\";
  1026.  
  1027.     case 1:
  1028.     return \"lsl    %2&$1f,%0\";
  1029.     
  1030.     case 2:
  1031.     return \"lsl    %2.h,%0\";
  1032.     }
  1033. }" )
  1034.  
  1035.  
  1036. ( define_insn "lshrsi3"
  1037.   [ ( set ( match_operand:SI 0 "register_operand" "=d,=d,=d" )
  1038.       ( lshiftrt:SI ( match_operand:SI 1 "register_operand" "0,0,0" )
  1039.             ( match_operand:SI 2 "general_operand" "J,n,h" ) ) ) ]
  1040.   ""
  1041.   "*
  1042. {
  1043.     switch ( which_alternative )
  1044.     {
  1045.  
  1046.     case 0:
  1047.     return \"lsr    %0\";
  1048.  
  1049.     case 1:
  1050.     return \"lsr    %2&$1f,%0\";
  1051.     
  1052.     case 2:
  1053.     return \"lsr    %2.h,%0\";
  1054.     }
  1055. }" )
  1056.  
  1057.  
  1058. ;;
  1059. ;;  ...........................................................................
  1060. ;;
  1061. ;;          ROTATIONS
  1062. ;;
  1063. ;;  ...........................................................................
  1064. ;;
  1065.  
  1066. ( define_insn "rotlsi3"
  1067.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1068.       ( rotate:SI ( match_operand:SI 1 "register_operand" "0" )
  1069.               ( match_operand:SI 2 "general_operand" "J" ) ) ) ]
  1070.   ""
  1071.   "rol    %0" )
  1072.  
  1073. ( define_insn "rotrsi3"
  1074.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1075.       ( rotatert:SI ( match_operand:SI 1 "register_operand" "0" )
  1076.             ( match_operand:SI 2 "general_operand" "J" ) ) ) ]
  1077.   ""
  1078.   "ror    %0" )
  1079.  
  1080. ;;
  1081. ;;  ...........................................................................
  1082. ;;
  1083. ;;          COMPARISONS
  1084. ;;
  1085. ;;  ...........................................................................
  1086. ;;
  1087.  
  1088. ( define_insn "cmpsi"
  1089.   [ ( set ( cc0 )
  1090.       ( compare ( match_operand:SI 0 "register_operand" "d" )
  1091.             ( match_operand:SI 1 "register_operand" "d" ) ) ) ]
  1092.   ""
  1093.   "*
  1094. {
  1095.     cc_status.mdep = INTEGER_CCS;
  1096.  
  1097.     return \"cmp    %1,%0\";
  1098. }" )
  1099.  
  1100. ( define_insn "cmpdf"
  1101.   [ ( set ( cc0 )
  1102.       ( compare ( match_operand:DF 0 "register_operand" "f" )
  1103.             ( match_operand:DF 1 "register_operand" "f" ) ) ) ]
  1104.   ""
  1105.   "*
  1106. {
  1107.     cc_status.mdep = FLOAT_CCS;
  1108.     
  1109.     return \"fcmp    %1,%0\";
  1110. }" )
  1111.  
  1112. ( define_insn "cmpsf"
  1113.   [ ( set ( cc0 )
  1114.       ( compare ( match_operand:SF 0 "register_operand" "f" )
  1115.             ( match_operand:SF 1 "register_operand" "f" ) ) ) ]
  1116.   ""
  1117.   "*
  1118. {
  1119.     cc_status.mdep = FLOAT_CCS;
  1120.     
  1121.     return \"fcmp    %1,%0\";
  1122. }" )
  1123.  
  1124. ;;
  1125. ;;  ...........................................................................
  1126. ;;
  1127. ;;          TESTS
  1128. ;;
  1129. ;;  ...........................................................................
  1130. ;;
  1131.  
  1132. ( define_insn "tstsi"
  1133.   [ ( set ( cc0 )
  1134.       ( match_operand:SI 0 "register_operand" "d,a" ) ) ]
  1135.   ""
  1136.   "*
  1137. {
  1138.     return ( 0 == which_alternative )
  1139.     ?
  1140.         \"tst    %0\"
  1141.         :
  1142.             \"moveta    (%0)\";
  1143. }" )
  1144.  
  1145. ( define_insn "tstdf"
  1146.   [ ( set ( cc0 )
  1147.       ( match_operand:DF 0 "register_operand" "f" ) ) ]
  1148.   ""
  1149.   "ftst    %0" )
  1150.  
  1151. ( define_insn "tstsf"
  1152.   [ ( set ( cc0 )
  1153.       ( match_operand:SF 0 "register_operand" "f" ) ) ]
  1154.   ""
  1155.   "ftst    %0" )
  1156.  
  1157.  
  1158. ;;
  1159. ;;  ...........................................................................
  1160. ;;
  1161. ;;          SCALAR CONVERSIONS USING TRUNCATION
  1162. ;;
  1163. ;;  ...........................................................................
  1164. ;;
  1165.  
  1166. ( define_insn "truncsiqi2"
  1167.   [ ( set ( match_operand:QI 0 "register_operand" "=d" )
  1168.       ( truncate:QI ( match_operand:SI 1 "register_operand" "d" )))
  1169.   ]
  1170.   ""
  1171.   "*
  1172. {
  1173.     if ( operands[0] == operands[1] )
  1174.     {
  1175.     return \"\";
  1176.     }
  1177.     else
  1178.     {
  1179.     return \"tfr    %1,%0\";
  1180.     }
  1181. }" )
  1182.  
  1183. ( define_insn "trunchiqi2"
  1184.   [ ( set ( match_operand:QI 0 "register_operand" "=d" )
  1185.       ( truncate:QI ( match_operand:HI 1 "register_operand" "d" )))
  1186.   ]
  1187.   ""
  1188.   "*
  1189. {
  1190.     if ( operands[0] == operands[1] )
  1191.     {
  1192.     return \"\";
  1193.     }
  1194.     else
  1195.     {
  1196.     return \"tfr    %1,%0\";
  1197.     }
  1198. }" )
  1199.  
  1200. ( define_insn "truncsihi2"
  1201.   [ ( set ( match_operand:HI 0 "register_operand" "=d" )
  1202.       ( truncate:HI ( match_operand:SI 1 "register_operand" "d" ))) 
  1203.   ]
  1204.   ""
  1205.   "*
  1206. {
  1207.     if ( operands[0] == operands[1] )
  1208.     {
  1209.     return \"\";
  1210.     }
  1211.     else
  1212.     {
  1213.     return \"tfr    %1,%0\";
  1214.     }
  1215. }" )
  1216.  
  1217. ( define_insn "truncdisi2"
  1218.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1219.       ( truncate:SI ( match_operand:DI 1 "register_operand" "D" ))) 
  1220.   ]
  1221.   ""
  1222.   "*
  1223. {
  1224.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1225.     {
  1226.     return \"\";
  1227.     }
  1228.     else
  1229.     {
  1230.     return \"tfr    %1,%0\";
  1231.     }
  1232. }" )
  1233.  
  1234. ;;
  1235. ;;  ...........................................................................
  1236. ;;
  1237. ;;          SCALAR CONVERSIONS USING ZERO EXTENSION
  1238. ;;
  1239. ;;  ...........................................................................
  1240. ;;
  1241.  
  1242. ( define_insn "zero_extendhisi2"
  1243.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1244.       ( zero_extend:SI ( match_operand:HI 1 "register_operand" "d" )))
  1245.   ]
  1246.   ""
  1247.   "*
  1248. {
  1249.     if ( operands[0] == operands[1] )
  1250.     {
  1251.     return \"\";
  1252.     }
  1253.     else
  1254.     {
  1255.     return \"tfr    %1,%0\";
  1256.     }
  1257. }" )
  1258.  
  1259. ( define_insn "zero_extendqihi2"
  1260.   [ ( set ( match_operand:HI 0 "register_operand" "=d" )
  1261.       ( zero_extend:HI ( match_operand:QI 1 "register_operand" "d" )))
  1262.   ]
  1263.   ""
  1264.   "*
  1265. {
  1266.     if ( operands[0] == operands[1] )
  1267.     {
  1268.     return \"\";
  1269.     }
  1270.     else
  1271.     {
  1272.     return \"tfr    %1,%0\";
  1273.     }
  1274. }" )
  1275.  
  1276. ( define_insn "zero_extendqisi2"
  1277.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1278.       ( zero_extend:SI ( match_operand:QI 1 "register_operand" "d" ))) 
  1279.   ]
  1280.   ""
  1281.   "*
  1282. {
  1283.     if ( operands[0] == operands[1] )
  1284.     {
  1285.     return \"\";
  1286.     }
  1287.     else
  1288.     {
  1289.     return \"tfr    %1,%0\";
  1290.     }
  1291. }" )
  1292.  
  1293. ( define_insn "zero_extendsidi2"
  1294.   [ ( set ( match_operand:DI 0 "register_operand" "=D,D" )
  1295.       ( zero_extend:DI ( match_operand:SI 1 "general_operand" "d,i" ))) 
  1296.   ]
  1297.   ""
  1298.   "*
  1299. {
  1300.     if ( which_alternative )
  1301.     {
  1302.     return \"move    #%c1,%0\";
  1303.     }
  1304.  
  1305.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1306.     {
  1307.     return \"\";
  1308.     }
  1309.     else
  1310.     {
  1311.     return \"tfr    %1,%0\";
  1312.     }
  1313. }" )
  1314.  
  1315. ;;
  1316. ;;  ...........................................................................
  1317. ;;
  1318. ;;          SCALAR CONVERSIONS USING SIGN EXTENSION
  1319. ;;
  1320. ;;  ...........................................................................
  1321. ;;
  1322.  
  1323. ( define_insn "extendhisi2"
  1324.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1325.       ( sign_extend:SI ( match_operand:HI 1 "register_operand" "d" )))
  1326.   ]
  1327.   ""
  1328.   "*
  1329. {
  1330.     if ( operands[0] == operands[1] )
  1331.     {
  1332.     return \"\";
  1333.     }
  1334.     else
  1335.     {
  1336.     return \"tfr    %1,%0\";
  1337.     }
  1338. }" )
  1339.  
  1340. ( define_insn "extendqihi2"
  1341.   [ ( set ( match_operand:HI 0 "register_operand" "=d" )
  1342.       ( sign_extend:HI ( match_operand:QI 1 "register_operand" "d" )))
  1343.   ]
  1344.   ""
  1345.   "*
  1346. {
  1347.     if ( operands[0] == operands[1] )
  1348.     {
  1349.     return \"\";
  1350.     }
  1351.     else
  1352.     {
  1353.     return \"tfr    %1,%0\";
  1354.     }
  1355. }" )
  1356.  
  1357. ( define_insn "extendqisi2"
  1358.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1359.       ( sign_extend:SI ( match_operand:QI 1 "register_operand" "d" )))
  1360.   ]
  1361.   ""
  1362.   "*
  1363. {
  1364.     if ( operands[0] == operands[1] )
  1365.     {
  1366.     return \"\";
  1367.     }
  1368.     else
  1369.     {
  1370.     return \"tfr    %1,%0\";
  1371.     }
  1372. }" )
  1373.  
  1374. ( define_insn "extendsidi2"
  1375.   [ ( set ( match_operand:DI 0 "register_operand" "=D,D" )
  1376.       ( sign_extend:DI ( match_operand:SI 1 "general_operand" "d,i" )))
  1377.   ]
  1378.   ""
  1379.   "*
  1380. {
  1381.     if ( which_alternative )
  1382.     {
  1383.     return \"move    #%c1,%0\";
  1384.     }
  1385.  
  1386.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1387.     {
  1388.     return \"\";
  1389.     }
  1390.     else
  1391.     {
  1392.     return \"tfr    %1,%0\";
  1393.     }
  1394. }" )
  1395.  
  1396. ;;
  1397. ;;  ...........................................................................
  1398. ;;
  1399. ;;          CONVERSIONS BETWEEN FLOAT AND DOUBLE
  1400. ;;
  1401. ;;  ...........................................................................
  1402. ;;
  1403.  
  1404. ( define_insn "extendsfdf2"
  1405.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  1406.       ( float_extend:DF ( match_operand:SF 1 "register_operand" "f" )))
  1407.   ]
  1408.   ""
  1409.   "ftfr.x    %1,%0" )
  1410.  
  1411. ( define_insn "truncdfsf2"
  1412.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  1413.       ( float_truncate:SF ( match_operand:DF 1 "register_operand" "f" )))
  1414.   ]
  1415.   ""
  1416.   "ftfr.s    %1,%0" )
  1417.  
  1418. ;;
  1419. ;;  ...........................................................................
  1420. ;;
  1421. ;;          CONVERSIONS BETWEEN FLOATING POINT AND INTEGER
  1422. ;;
  1423. ;;  ...........................................................................
  1424. ;;
  1425.  
  1426. ( define_insn "floatunssidf2"
  1427.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  1428.       ( unsigned_float:DF 
  1429.         ( match_operand:SI 1 "register_operand" "0" )))
  1430.   ]
  1431.   ""
  1432.   "floatu.x    %0" )
  1433.  
  1434. ( define_insn "floatunssisf2"
  1435.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  1436.       ( unsigned_float:SF 
  1437.         ( match_operand:SI 1 "register_operand" "0" )))
  1438.   ]
  1439.   ""
  1440.   "floatu.s    %0" )
  1441.  
  1442. ( define_insn "floatsidf2"
  1443.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  1444.       ( float:DF 
  1445.         ( match_operand:SI 1 "register_operand" "0" )))
  1446.   ]
  1447.   ""
  1448.   "float.x    %0" )
  1449.  
  1450. ( define_insn "floatsisf2"
  1451.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  1452.       ( float:SF 
  1453.         ( match_operand:SI 1 "register_operand" "0" )))
  1454.   ]
  1455.   ""
  1456.   "float.s    %0" )
  1457.  
  1458. ( define_insn "fixdfsi2"
  1459.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1460.       ( fix:SI 
  1461.         ( match_operand:DF 1 "register_operand" "=f" )))
  1462.   ]
  1463.   ""
  1464.   "*
  1465. {
  1466.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1467.     {
  1468.     return \"intrz    %0\";
  1469.     }
  1470.     else
  1471.     {
  1472.     return \"intrz    %1\;tfr    %1,%0\";
  1473.     }
  1474. }" )
  1475.  
  1476. ( define_insn "fixsfsi2"
  1477.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1478.       ( fix:SI 
  1479.         ( match_operand:SF 1 "register_operand" "=f" )))
  1480.   ]
  1481.   ""
  1482.   "*
  1483. {
  1484.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1485.     {
  1486.     return \"intrz    %0\";
  1487.     }
  1488.     else
  1489.     {
  1490.     return \"intrz    %1\;tfr    %1,%0\";
  1491.     }
  1492. }" )
  1493.  
  1494. ( define_insn "fixunsdfsi2"
  1495.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1496.       ( unsigned_fix:SI 
  1497.         ( match_operand:DF 1 "register_operand" "=f" )))
  1498.   ]
  1499.   ""
  1500.   "*
  1501. {
  1502.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1503.     {
  1504.     return \"inturz    %0\";
  1505.     }
  1506.     else
  1507.     {
  1508.     return \"inturz    %1\;tfr    %1,%0\";
  1509.     }
  1510. }" )
  1511.  
  1512. ( define_insn "fixunssfsi2"
  1513.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1514.       ( unsigned_fix:SI 
  1515.         ( match_operand:SF 1 "register_operand" "=f" )))
  1516.   ]
  1517.   ""
  1518.   "*
  1519. {
  1520.     if ( REGNO ( operands[0] ) == REGNO ( operands[1] ))
  1521.     {
  1522.     return \"inturz    %0\";
  1523.     }
  1524.     else
  1525.     {
  1526.     return \"inturz    %1\;tfr    %1,%0\";
  1527.     }
  1528. }" )
  1529.  
  1530. ( define_insn "ftruncdf2"
  1531.   [ ( set ( match_operand:DF 0 "register_operand" "=f" )
  1532.       ( float_truncate:DF 
  1533.         ( match_operand:DF 1 "register_operand" "0" )))
  1534.   ]
  1535.   ""
  1536.   "fint    %0" )
  1537.  
  1538. ( define_insn "ftruncsf2"
  1539.   [ ( set ( match_operand:SF 0 "register_operand" "=f" )
  1540.       ( float_truncate:SF 
  1541.         ( match_operand:SF 1 "register_operand" "0" )))
  1542.   ]
  1543.   ""
  1544.   "fint    %0" )
  1545.  
  1546. ( define_expand "fix_truncdfsi2"
  1547.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1548.       ( fix:SI 
  1549.         ( match_operand:DF 1 "register_operand" "0" )))
  1550.   ]
  1551.   ""
  1552.   "" )
  1553.  
  1554. ( define_expand "fix_truncsfsi2"
  1555.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1556.       ( fix:SI 
  1557.         ( match_operand:SF 1 "register_operand" "0" )))
  1558.   ]
  1559.   ""
  1560.   "" )
  1561.  
  1562. ( define_expand "fixuns_truncdfsi2"
  1563.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1564.       ( unsigned_fix:SI 
  1565.         ( match_operand:DF 1 "register_operand" "0" )))
  1566.   ]
  1567.   ""
  1568.   "" )
  1569.  
  1570. ( define_expand "fixuns_truncsfsi2"
  1571.   [ ( set ( match_operand:SI 0 "register_operand" "=d" )
  1572.       ( unsigned_fix:SI 
  1573.         ( match_operand:SF 1 "register_operand" "0" )))
  1574.   ]
  1575.   ""
  1576.   "" )
  1577.  
  1578. ;;
  1579. ;;  ...........................................................................
  1580. ;;
  1581. ;;          CONDITIONAL JUMPS
  1582. ;;
  1583. ;;  ...........................................................................
  1584. ;;
  1585.  
  1586. ;; This shape should match the do loop shape. 
  1587.  
  1588. ( define_insn "do"
  1589.   [ ( parallel
  1590.       [ ( clobber ( cc0 ))
  1591.     ( use ( match_operand:SI 0 "general_operand" "d,L" ))
  1592.     ( set ( pc ) ( if_then_else ( eq ( cc0 ) ( const_int 0 ))
  1593.                     ( label_ref ( match_operand 1 "" "" ))
  1594.                     ( pc )))
  1595.       ] )
  1596.   ]
  1597.   ""
  1598.   "*
  1599. {
  1600.     /* we must scan forward and make sure that there is at least one non-do
  1601.      * insn between this insn and the target label. If not, 86 the loop. 
  1602.      * BTW, a nop instruction doesn't count.
  1603.      */
  1604.     rtx scan = insn;
  1605.     
  1606.     while ( scan && ( operands[1] != scan ))
  1607.     {
  1608.     if (( INSN == GET_CODE ( scan )) && 
  1609.         ( const0_rtx != PATTERN ( scan )))
  1610.     {
  1611.         break;
  1612.     }
  1613.         scan = NEXT_INSN ( scan );
  1614.     }
  1615.     
  1616.     if ( ! scan )
  1617.     {
  1618.     /* do without corresponding od ! */
  1619.     abort ( );
  1620.     }
  1621.     if (( scan == operands[1] ) ||
  1622.     ( which_alternative && ( 1 == INTVAL ( operands[0] ))))
  1623.     {
  1624.     /* we're not really doing a do; record that no conflicts are 
  1625.      * possible.
  1626.      */
  1627.     record_address_regs_used ( const0_rtx );
  1628.  
  1629.     /* decrement the number of uses at the target label. */
  1630.  
  1631.     -- LABEL_NUSES ( operands[1] );
  1632.  
  1633.     return \"\";
  1634.     }
  1635.  
  1636.     /* record potential r/n register conflicts. */
  1637.     record_address_regs_used ( scan );
  1638.  
  1639.     if ( which_alternative )
  1640.     {
  1641.     if ( 0xfff00000 & INTVAL ( operands[0] ))
  1642.     {
  1643.         return \"move    #%c0,d8.l\;do    d8.l,%l1\";
  1644.     }
  1645.     else
  1646.     {
  1647.         return \"do    #%c0,%l1\";
  1648.     }
  1649.     }
  1650.     else
  1651.     {
  1652.     return \"do    %z0,%l1\";
  1653.     }
  1654. }" )
  1655.  
  1656. ;; This shape should match the back-branch insn and produce no real code.
  1657. ;; It is a placeholder so that the compiler knows that the do loop target
  1658. ;; label is implicitly a branch.
  1659.  
  1660. ( define_insn "od"
  1661.   [ ( parallel 
  1662.       [ ( clobber ( cc0 ))
  1663.     ( set ( pc ) ( match_operand 0 "" "" ))
  1664.       ] )
  1665.   ]
  1666.   ""
  1667.   "*
  1668. {
  1669.     rtx scan = PREV_INSN ( insn );
  1670.     
  1671.     while ( scan && 
  1672.        (( INSN != GET_CODE ( scan )) || 
  1673.         /* ignore latent nop insns! */
  1674.         ( const0_rtx == PATTERN ( scan ))) &&
  1675.        ( JUMP_INSN != GET_CODE ( scan )))
  1676.     {
  1677.     scan = PREV_INSN ( scan );
  1678.     }
  1679.     if ( ! scan )
  1680.     {
  1681.     /* od without corresponding do ! */
  1682.     abort ( );
  1683.     }
  1684.     if ( JUMP_INSN == GET_CODE ( scan ))
  1685.     {
  1686.     /* pop the stack - no chance of conflict. */
  1687.     (void) conflicting_address_regs_set_p ( const0_rtx );
  1688.     
  1689.     /* but hey- auto bonejob! we can't have a jmp as the last insn
  1690.        within the DO! */
  1691.  
  1692.     return \"nop\";
  1693.     }
  1694.     if ( INSN == GET_CODE ( scan ))
  1695.     {
  1696.     /* if we have a conflict, emit a noop to sw interlock. */
  1697.     if ( conflicting_address_regs_set_p ( scan ))
  1698.     {
  1699.         return \"nop\";
  1700.     }
  1701.     }
  1702.     return \"\";
  1703. }" )
  1704.  
  1705. ( define_insn "beq"
  1706.   [ ( set ( pc )
  1707.       ( if_then_else ( eq ( cc0 )
  1708.                   ( const_int 0 ) )
  1709.              ( label_ref ( match_operand 0 "" "" ) )
  1710.              ( pc ) ) ) ]
  1711.   ""
  1712.   "*
  1713. {
  1714.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1715.     {
  1716.     return \"fjeq    %l0\";
  1717.     }
  1718.     return \"jeq    %l0\";
  1719. }" )
  1720.  
  1721. ( define_insn "bne"
  1722.   [ ( set ( pc )
  1723.       ( if_then_else ( ne ( cc0 )
  1724.                   ( const_int 0 ) )
  1725.              ( label_ref ( match_operand 0 "" "" ) )
  1726.              ( pc ) ) ) ]
  1727.   ""
  1728.   "*
  1729. {
  1730.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1731.     {
  1732.     return \"fjne    %l0\";
  1733.     }
  1734.     return \"jne    %l0\";
  1735. }" )
  1736.  
  1737. ( define_insn "bgt"
  1738.   [ ( set ( pc )
  1739.       ( if_then_else ( gt ( cc0 )
  1740.                   ( const_int 0 ) )
  1741.              ( label_ref ( match_operand 0 "" "" ) )
  1742.              ( pc ) ) ) ]
  1743.   ""
  1744.   "*
  1745. {
  1746.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1747.     {
  1748.     return \"fjgt    %l0\";
  1749.     }
  1750.     return \"jgt    %l0\";
  1751. }" )
  1752.  
  1753. ( define_insn "bgtu"
  1754.   [ ( set ( pc )
  1755.       ( if_then_else ( gtu ( cc0 )
  1756.                    ( const_int 0 ) )
  1757.              ( label_ref ( match_operand 0 "" "" ) )
  1758.              ( pc ) ) ) ]
  1759.   ""
  1760.   "*
  1761. {
  1762.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  1763.     {
  1764.     return \"jne    %l0\";
  1765.     }
  1766.     else
  1767.     {
  1768.     return \"jhi    %l0\";
  1769.     }
  1770. }" )
  1771.  
  1772. ( define_insn "blt"
  1773.   [ ( set ( pc )
  1774.       ( if_then_else ( lt ( cc0 )
  1775.                   ( const_int 0 ) )
  1776.              ( label_ref ( match_operand 0 "" "" ) )
  1777.              ( pc ) ) ) ]
  1778.   ""
  1779.   "*
  1780. {
  1781.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1782.     {
  1783.     return \"fjlt    %l0\";
  1784.     }
  1785.     return \"jlt    %l0\";
  1786. }" )
  1787.  
  1788. ( define_insn "bltu"
  1789.   [ ( set ( pc )
  1790.       ( if_then_else ( ltu ( cc0 )
  1791.                    ( const_int 0 ) )
  1792.              ( label_ref ( match_operand 0 "" "" ) )
  1793.              ( pc ) ) ) ]
  1794.   ""
  1795.   "*
  1796. {
  1797.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  1798.     {
  1799.     return \"\";
  1800.     }
  1801.     else
  1802.     {
  1803.     return \"jlo    %l0\";
  1804.     }
  1805. }" )
  1806.  
  1807. ( define_insn "bge"
  1808.   [ ( set ( pc )
  1809.       ( if_then_else ( ge ( cc0 )
  1810.                   ( const_int 0 ) )
  1811.              ( label_ref ( match_operand 0 "" "" ) )
  1812.              ( pc ) ) ) ]
  1813.   ""
  1814.   "*
  1815. {
  1816.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1817.     {
  1818.     return \"fjge    %l0\";
  1819.     }
  1820.     return \"jge    %l0\";
  1821. }" )
  1822.  
  1823. ( define_insn "bgeu"
  1824.   [ ( set ( pc )
  1825.       ( if_then_else ( geu ( cc0 )
  1826.                    ( const_int 0 ) )
  1827.              ( label_ref ( match_operand 0 "" "" ) )
  1828.              ( pc ) ) ) ]
  1829.   ""
  1830.   "*
  1831. {
  1832.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  1833.     {
  1834.     return \"jmp    %l0\";
  1835.     }
  1836.     else
  1837.     {
  1838.     return \"jhs    %l0\";
  1839.     }
  1840. }")
  1841.  
  1842. ( define_insn "ble"
  1843.   [ ( set ( pc )
  1844.       ( if_then_else ( le ( cc0 )
  1845.                   ( const_int 0 ) )
  1846.              ( label_ref ( match_operand 0 "" "" ) )
  1847.              ( pc ) ) ) ]
  1848.   ""
  1849.   "*
  1850. {
  1851.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1852.     {
  1853.     return \"fjle    %l0\";
  1854.     }
  1855.     return \"jle    %l0\";
  1856. }" )
  1857.  
  1858. ( define_insn "bleu"
  1859.   [ ( set ( pc )
  1860.       ( if_then_else ( leu ( cc0 )
  1861.                    ( const_int 0 ) )
  1862.              ( label_ref ( match_operand 0 "" "" ) )
  1863.              ( pc ) ) ) ]
  1864.   ""
  1865.   "*
  1866. {
  1867.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  1868.     {
  1869.     return \"jeq    %l0\";
  1870.     }
  1871.     else
  1872.     {
  1873.     return \"jls    %l0\";
  1874.     }
  1875. }")
  1876.  
  1877.  
  1878. ;;
  1879. ;;  ...........................................................................
  1880. ;;
  1881. ;;          CONDITIONAL JUMPS WITH INVERTED REGISTER ALLOCATION
  1882. ;;
  1883. ;;  ...........................................................................
  1884. ;;
  1885.  
  1886. ( define_insn ""
  1887.   [ ( set ( pc )
  1888.       ( if_then_else ( eq ( cc0 )
  1889.                   ( const_int 0 ) )
  1890.              ( pc )
  1891.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1892.   ""
  1893.   "*
  1894. {
  1895.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1896.     {
  1897.     return \"fjne    %l0\";
  1898.     }
  1899.     return \"jne    %l0\";
  1900. }" )
  1901.  
  1902. ( define_insn ""
  1903.   [ ( set ( pc )
  1904.       ( if_then_else ( ne ( cc0 )
  1905.                   ( const_int 0 ) )
  1906.              ( pc )
  1907.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1908.   ""
  1909.   "*
  1910. {
  1911.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1912.     {
  1913.     return \"fjeq    %l0\";
  1914.     }
  1915.     return \"jeq    %l0\";
  1916. }" )
  1917.  
  1918. ( define_insn ""
  1919.   [ ( set ( pc )
  1920.       ( if_then_else ( gt ( cc0 )
  1921.                   ( const_int 0 ) )
  1922.              ( pc )
  1923.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1924.   ""
  1925.   "*
  1926. {
  1927.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1928.     {
  1929.     return \"fjle    %l0\";
  1930.     }
  1931.     return \"jle    %l0\";
  1932. }" )
  1933.  
  1934. ( define_insn ""
  1935.   [ ( set ( pc )
  1936.       ( if_then_else ( gtu ( cc0 )
  1937.                    ( const_int 0 ) )
  1938.              ( pc )
  1939.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1940.   ""
  1941.   "*
  1942. {
  1943.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  1944.     {
  1945.     return \"jeq    %l0\";
  1946.     }
  1947.     else
  1948.     {
  1949.     return \"jls    %l0\";
  1950.     }
  1951. }")
  1952.  
  1953. ( define_insn ""
  1954.   [ ( set ( pc )
  1955.       ( if_then_else ( lt ( cc0 )
  1956.                   ( const_int 0 ) )
  1957.              ( pc )
  1958.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1959.   ""
  1960.   "*
  1961. {
  1962.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1963.     {
  1964.     return \"fjge    %l0\";
  1965.     }
  1966.     return \"jge    %l0\";
  1967. }" )
  1968.  
  1969. ( define_insn ""
  1970.   [ ( set ( pc )
  1971.       ( if_then_else ( ltu ( cc0 )
  1972.                    ( const_int 0 ) )
  1973.              ( pc )
  1974.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1975.   ""
  1976.   "*
  1977. {
  1978.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  1979.     {
  1980.     return \"jmp    %l0\";
  1981.     }
  1982.     else
  1983.     {
  1984.     return \"jhs    %l0\";
  1985.     }
  1986. }")
  1987.  
  1988. ( define_insn ""
  1989.   [ ( set ( pc )
  1990.       ( if_then_else ( ge ( cc0 )
  1991.                   ( const_int 0 ) )
  1992.              ( pc )
  1993.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  1994.   ""
  1995.   "*
  1996. {
  1997.     if ( FLOAT_CCS == cc_prev_status.mdep )
  1998.     {
  1999.     return \"fjlt    %l0\";
  2000.     }
  2001.     return \"jlt    %l0\";
  2002. }" )
  2003.  
  2004. ( define_insn ""
  2005.   [ ( set ( pc )
  2006.       ( if_then_else ( geu ( cc0 )
  2007.                    ( const_int 0 ) )
  2008.              ( pc )
  2009.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  2010.   ""
  2011.   "*
  2012. {
  2013.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2014.     {
  2015.     return \"\";
  2016.     }
  2017.     else
  2018.     {
  2019.     return \"jlo    %l0\";
  2020.     }
  2021. }" )
  2022.  
  2023. ( define_insn ""
  2024.   [ ( set ( pc )
  2025.       ( if_then_else ( le ( cc0 )
  2026.                   ( const_int 0 ) )
  2027.              ( pc )
  2028.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  2029.   ""
  2030.   "*
  2031. {
  2032.     if ( FLOAT_CCS == cc_prev_status.mdep )
  2033.     {
  2034.     return \"fjgt    %l0\";
  2035.     }
  2036.     return \"jgt    %l0\";
  2037. }" )
  2038.  
  2039. ( define_insn ""
  2040.   [ ( set ( pc )
  2041.       ( if_then_else ( leu ( cc0 )
  2042.                    ( const_int 0 ) )
  2043.              ( pc )
  2044.              ( label_ref ( match_operand 0 "" "" ) ) ) ) ]
  2045.   ""
  2046.   "*
  2047. {
  2048.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2049.     {
  2050.     return \"jne    %l0\";
  2051.     }
  2052.     else
  2053.     {
  2054.     return \"jhi    %l0\";
  2055.     }
  2056. }")
  2057.  
  2058. ;;
  2059. ;;  ...........................................................................
  2060. ;;
  2061. ;;          CONDITIONALY STORE ZERO OR NON-ZERO
  2062. ;;
  2063. ;;  ...........................................................................
  2064. ;;
  2065.  
  2066. ( define_insn "seq"
  2067.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2068.       ( eq ( cc0 ) ( const_int 0 ))) 
  2069.   ]
  2070.   ""
  2071.   "*
  2072. {
  2073.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2074.     {
  2075.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2076.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2077.     {
  2078.         return \"move    #0,%z0\;inc    %0    ffeq\";
  2079.     }
  2080.     }
  2081.     else
  2082.     {
  2083.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2084.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2085.     {
  2086.         return \"move    #0,%z0\;inc    %0    ffeq\";
  2087.     }
  2088.     }
  2089.     return \"move    #0,%z0\;inc    %0    ifeq\";
  2090. }" )
  2091.  
  2092. ( define_insn "sne"
  2093.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2094.       ( ne ( cc0 ) ( const_int 0 )))
  2095.   ]
  2096.   ""
  2097.   "*
  2098. {
  2099.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2100.     {
  2101.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2102.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2103.     {
  2104.         return \"move    #0,%z0\;inc    %0    ffne\";
  2105.     }
  2106.     }
  2107.     else
  2108.     {
  2109.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2110.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2111.     {
  2112.         return \"move    #0,%z0\;inc    %0    ffne\";
  2113.     }
  2114.     }
  2115.     return \"move    #0,%z0\;inc    %0    ifne\";
  2116. }" )
  2117.  
  2118. ( define_insn "sgt"
  2119.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2120.       ( gt ( cc0 ) ( const_int 0 ))) 
  2121.   ]
  2122.   ""
  2123.   "*
  2124. {
  2125.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2126.     {
  2127.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2128.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2129.     {
  2130.         return \"move    #0,%z0\;inc    %0    ffgt\";
  2131.     }
  2132.     }
  2133.     else
  2134.     {
  2135.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2136.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2137.     {
  2138.         return \"move    #0,%z0\;inc    %0    ffgt\";
  2139.     }
  2140.     }
  2141.     return \"move    #0,%z0\;inc    %0    ifgt\";
  2142. }" )
  2143.  
  2144. ( define_insn "sgtu"
  2145.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2146.       ( gtu ( cc0 ) ( const_int 0 ))) 
  2147.   ]
  2148.   ""
  2149.   "*
  2150. {
  2151.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2152.     {
  2153.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2154.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2155.     {
  2156.         return \"move    #0,%z0\;inc    %0    ffne\";
  2157.     }
  2158.     else
  2159.     {
  2160.         return \"move    #0,%z0\;inc    %0    ifne\";
  2161.     }
  2162.     }
  2163.     else
  2164.     {
  2165.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2166.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2167.     {
  2168.         return \"move    #0,%z0\;inc    %0    ffhi\";
  2169.     }
  2170.     }
  2171.     return \"move    #0,%z0\;inc    %0    ifhi\";
  2172. }" )
  2173.  
  2174. ( define_insn "slt"
  2175.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2176.       ( lt ( cc0 ) ( const_int 0 ))) 
  2177.   ]
  2178.   ""
  2179.   "*
  2180. {
  2181.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2182.     {
  2183.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2184.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2185.     {
  2186.         return \"move    #0,%z0\;inc    %0    fflt\";
  2187.     }
  2188.     }
  2189.     else
  2190.     {
  2191.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2192.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2193.     {
  2194.         return \"move    #0,%z0\;inc    %0    fflt\";
  2195.     }
  2196.     }
  2197.     return \"move    #0,%z0\;inc    %0    iflt\";
  2198. }" )
  2199.  
  2200. ( define_insn "sltu"
  2201.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2202.       ( ltu ( cc0 ) ( const_int 0 ))) 
  2203.   ]
  2204.   ""
  2205.   "*
  2206. {
  2207.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2208.     {
  2209.     return \"move    #0,%z0\";
  2210.     }
  2211.     else
  2212.     {
  2213.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2214.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2215.     {
  2216.         return \"move    #0,%z0\;inc    %0    fflo\";
  2217.     }
  2218.     }
  2219.     return \"move    #0,%z0\;inc    %0    iflo\";
  2220. }" )
  2221.  
  2222. ( define_insn "sge"
  2223.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2224.       ( ge ( cc0 ) ( const_int 0 ))) 
  2225.   ]
  2226.   ""
  2227.   "*
  2228. {
  2229.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2230.     {
  2231.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2232.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2233.     {
  2234.         return \"move    #0,%z0\;inc    %0    ffge\";
  2235.     }
  2236.     }
  2237.     else
  2238.     {
  2239.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2240.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2241.     {
  2242.         return \"move    #0,%z0\;inc    %0    ffge\";
  2243.     }
  2244.     }
  2245.     return \"move    #0,%z0\;inc    %0    ifge\";
  2246. }" )
  2247.  
  2248. ( define_insn "sgeu"
  2249.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2250.       ( geu ( cc0 ) ( const_int 0 ))) 
  2251.   ]
  2252.   ""
  2253.   "*
  2254. {
  2255.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2256.     {
  2257.     return \"move    #1,%z0\";
  2258.     }
  2259.     else
  2260.     {
  2261.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2262.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2263.     {
  2264.         return \"move    #0,%z0\;inc    %0    ffhs\";
  2265.     }
  2266.     }
  2267.     return \"move    #0,%z0\;inc    %0    ifhs\";
  2268. }" )
  2269.  
  2270. ( define_insn "sle"
  2271.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2272.       ( le ( cc0 ) ( const_int 0 ))) 
  2273.   ]
  2274.   ""
  2275.   "*
  2276. {
  2277.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2278.     {
  2279.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2280.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2281.     {
  2282.         return \"move    #0,%z0\;inc    %0    ffle\";
  2283.     }
  2284.     }
  2285.     else
  2286.     {
  2287.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2288.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2289.     {
  2290.         return \"move    #0,%z0\;inc    %0    ffle\";
  2291.     }
  2292.     }
  2293.     return \"move    #0,%z0\;inc    %0    ifle\";
  2294. }" )
  2295.  
  2296. ( define_insn "sleu"
  2297.   [ ( set ( match_operand:SI 0 "general_operand" "=d" )
  2298.       ( leu ( cc0 ) ( const_int 0 ))) 
  2299.   ]
  2300.   ""
  2301.   "*
  2302. {
  2303.     if ( COMPARE != GET_CODE ( cc_prev_status.value2 ))
  2304.     {
  2305.     if (( DFmode == GET_MODE ( cc_prev_status.value2 )) ||
  2306.         ( SFmode == GET_MODE ( cc_prev_status.value2 )))
  2307.     {
  2308.         return \"move    #0,%z0\;inc    %0    ffeq\";
  2309.     }
  2310.     else
  2311.     {
  2312.         return \"move    #0,%z0\;inc    %0    ifeq\";
  2313.     }
  2314.     }
  2315.     else
  2316.     {
  2317.     if (( DFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))) ||
  2318.         ( SFmode == GET_MODE ( XEXP ( cc_prev_status.value2, 0 ))))
  2319.     {
  2320.         return \"move    #0,%z0\;inc    %0    ffls\";
  2321.     }
  2322.     }
  2323.     return \"move    #0,%z0\;inc    %0    ifls\";
  2324. }" )
  2325.  
  2326. ;;
  2327. ;;  ...........................................................................
  2328. ;;
  2329. ;;          UNCONDITIONAL JUMP
  2330. ;;
  2331. ;;  ...........................................................................
  2332. ;;
  2333.  
  2334. ( define_insn "jump"
  2335.   [ ( set ( pc )
  2336.       ( label_ref ( match_operand 0 "" "" ) ) ) ]
  2337.   ""
  2338.   "jmp    (%l0)" )
  2339.  
  2340.  
  2341. ;;
  2342. ;;  ...........................................................................
  2343. ;;
  2344. ;;          TABLE JUMP ( SWITCH IMPLEMENTATION )
  2345. ;;
  2346. ;;  ...........................................................................
  2347. ;;
  2348.  
  2349. ( define_insn "tablejump"
  2350.   [ ( set ( pc ) ( match_operand:SI 0 "register_operand" "a" ) )
  2351.     ( use ( label_ref ( match_operand 1 "" "" ) ) ) ]
  2352.   ""
  2353.   "jmp (%0)" )
  2354.  
  2355.  
  2356. ;;
  2357. ;;  ...........................................................................
  2358. ;;
  2359. ;;          SUBROUTINE CALLS
  2360. ;;
  2361. ;;  ...........................................................................
  2362. ;;
  2363.  
  2364. ( define_insn "call"
  2365.   [ ( call ( match_operand:SI 0 "general_operand" "<>ma" )
  2366.        ( match_operand:SI 1 "immediate_operand" "i" )) 
  2367.   ]
  2368.   ""
  2369.   "*
  2370. {
  2371.     CC_STATUS_INIT;
  2372.  
  2373.     switch ( INTVAL ( operands[1] ))
  2374.     {
  2375.     case 0:
  2376.     return \"jsr    %0\";
  2377.  
  2378.     case 1:
  2379.     return \"jsr    %0\;move    (r6)-\";
  2380.     
  2381.     case 2:
  2382.     return \"jsr    %0\;move    (r6)-\;move    (r6)-\";
  2383.     
  2384.     default:
  2385.     return \"jsr    %0\;move    #%c1,n6\;move    (r6)-n6\";
  2386.     }
  2387. }" )
  2388.  
  2389. ( define_insn "call_value"
  2390.   [ ( set ( match_operand 0 "" "" )
  2391.       ( call ( match_operand:SI 1 "general_operand" "<>ma" )
  2392.          ( match_operand:SI 2 "immediate_operand" "i" )))
  2393.   ]
  2394.   ""
  2395.   "*
  2396. {
  2397.     switch ( INTVAL ( operands[2] ))
  2398.     {
  2399.     case 0:
  2400.     return \"jsr    %1\";
  2401.     
  2402.     case 1:
  2403.     return \"jsr    %1\;move    (r6)-\";
  2404.     
  2405.     case 2:
  2406.     return \"jsr    %1\;move    (r6)-\;move    (r6)-\";
  2407.     
  2408.     default:
  2409.     return \"jsr    %1\;move    #%c2,n6\;move    (r6)-n6\";
  2410.     }
  2411. }" )
  2412.  
  2413.  
  2414. ;;
  2415. ;;  ...........................................................................
  2416. ;;
  2417. ;;          NOP
  2418. ;;
  2419. ;;  ...........................................................................
  2420. ;;
  2421.  
  2422. ( define_insn "nop"
  2423.   [ ( const_int 0 ) ]
  2424.   ""
  2425.   "*
  2426. {
  2427.     rtx peek = PREV_INSN ( insn );
  2428.     
  2429.     while (( peek ) && 
  2430.        (( NOTE == GET_CODE ( peek )) ||
  2431.         (( JUMP_INSN == GET_CODE ( peek )) &&
  2432.          ( PARALLEL == GET_CODE ( PATTERN ( peek ))))))
  2433.     {
  2434.     peek = PREV_INSN ( peek );
  2435.     }
  2436.     if (( ! peek ) || ( CODE_LABEL != GET_CODE ( peek )) ||
  2437.     ( ! LABEL_NUSES ( peek )))
  2438.     {
  2439.     return \"\";
  2440.     }
  2441.     
  2442.     peek = NEXT_INSN ( insn );
  2443.     while (( peek ) && 
  2444.        (( NOTE == GET_CODE ( peek )) ||
  2445.         (( JUMP_INSN == GET_CODE ( peek )) &&
  2446.          ( PARALLEL == GET_CODE ( PATTERN ( peek ))))))
  2447.     {
  2448.     peek = NEXT_INSN ( peek );
  2449.     }
  2450.     if (( ! peek ) || 
  2451.     ( ! LABEL_NUSES ( peek )) ||
  2452.     (( CODE_LABEL != GET_CODE ( peek )) && 
  2453.      ( const0_rtx != PATTERN ( peek ))))
  2454.     {
  2455.     return \"\";
  2456.     }
  2457.  
  2458.     return \"nop\";
  2459. }" )
  2460.  
  2461. ;; This insn is needed because jump.c doesn't realize that this is really
  2462. ;; a nop.
  2463.  
  2464. ( define_insn "" [ ( set ( pc ) ( pc )) ] "" "" )
  2465.  
  2466. ;;
  2467. ;;  ...........................................................................
  2468. ;;
  2469. ;;          PEEPHOLE OPTIMIZATIONS
  2470. ;;
  2471. ;;  ...........................................................................
  2472. ;;
  2473.  
  2474. ;;- Local variables:
  2475. ;;- mode:emacs-lisp
  2476. ;;- comment-start: ";;- "
  2477. ;;- eval: ( set-syntax-table ( copy-sequence ( syntax-table ) ) )
  2478. ;;- eval: ( modify-syntax-entry ?[ "(]" )
  2479. ;;- eval: ( modify-syntax-entry ?] ")[" )
  2480. ;;- eval: ( modify-syntax-entry ?{ "(}" )
  2481. ;;- eval: ( modify-syntax-entry ?} "){" )
  2482. ;;- End:
  2483.  
  2484.